home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / ARASAN_S.ZIP / ATCKENTR.CPP < prev    next >
C/C++ Source or Header  |  1993-11-17  |  3KB  |  127 lines

  1. // Copyright 1993 by Jon Dart.  All Rights Reserved
  2.  
  3. #include "atckentr.h"
  4. #include <stdio.h>
  5.  
  6. // data layout:
  7.  
  8. //bits    
  9. //0-1    pawn attacks
  10. //2-3    knight attacks
  11. //4-5    bishop attacks
  12. //6-7    rook attacks
  13. //8-10    queen attacks
  14. //11    king attacks
  15. //12-15 total # of attacks
  16.  
  17. Attack_Entry::Attack_Entry() 
  18.   : info(0)
  19. {
  20. }
  21.  
  22. static const int16 masks[] =
  23.  { 0, 1, 4, 0x10, 0x40, 0x100, 0x800, 0 };
  24.  
  25. static const int16 masks2[] =
  26.  { 0, 3, 0x0c, 0x30, 0xc0, 0x700, 0x800, 0};
  27.  
  28. void Attack_Entry::add_attack(const Piece::PieceType p)
  29. {
  30.    info += (masks[(int)p] + 0x1000);
  31. }
  32.  
  33. void Attack_Entry::remove_attack(const Piece::PieceType p)
  34. {
  35.     info -= (masks[(int)p] + 0x1000);
  36. }
  37.  
  38. Piece::PieceType Attack_Entry::remove_min_attacker()
  39. {
  40.     if (!any_attacks())
  41.        return Piece::Empty;
  42.     else if (num_attacks(Piece::Pawn))
  43.     {
  44.        remove_attack(Piece::Pawn);
  45.        return Piece::Pawn;
  46.     }
  47.     else if (num_attacks(Piece::Knight))
  48.     {
  49.        remove_attack(Piece::Knight);
  50.        return Piece::Knight;
  51.     }
  52.     else if (num_attacks(Piece::Bishop))
  53.     {
  54.        remove_attack(Piece::Bishop);
  55.        return Piece::Bishop;
  56.     }
  57.     else if (num_attacks(Piece::Rook))
  58.     {
  59.        remove_attack(Piece::Rook);
  60.        return Piece::Rook;
  61.     }
  62.     else if (num_attacks(Piece::Queen))
  63.     {
  64.        remove_attack(Piece::Queen);
  65.        return Piece::Queen;
  66.     }
  67.     else 
  68.     {
  69.        remove_attack(Piece::King);
  70.        return Piece::King;
  71.     }
  72. }
  73.  
  74. Piece::PieceType Attack_Entry::min_attacker() const
  75. {
  76.     if (!any_attacks())
  77.        return Piece::Empty;
  78.     else if (num_attacks(Piece::Pawn))
  79.        return Piece::Pawn;
  80.     else if (num_attacks(Piece::Knight))
  81.        return Piece::Knight;
  82.     else if (num_attacks(Piece::Bishop))
  83.        return Piece::Bishop;
  84.     else if (num_attacks(Piece::Rook))
  85.        return Piece::Rook;
  86.     else if (num_attacks(Piece::Queen))
  87.        return Piece::Queen;
  88.     else 
  89.        return Piece::King;
  90. }
  91.  
  92. unsigned Attack_Entry::num_attacks() const
  93.     return (info & 0xf000) >> 12;
  94. }
  95.  
  96. unsigned Attack_Entry::num_attacks(const Piece::PieceType p) const
  97. {
  98.     int16 info2 = info & masks2[(int)p];
  99.     if (info2 == 0)
  100.        return 0;
  101.     switch (p)
  102.     {
  103.        case Piece::Pawn:
  104.           return info2;
  105.        case Piece::Knight:
  106.           return info2 >> 2;
  107.        case Piece::Bishop:
  108.           return info2 >> 4;
  109.        case Piece::Rook:
  110.           return info2 >> 6;
  111.        case Piece::Queen:
  112.           return info2 >> 8;
  113.        case Piece::King:
  114.           return 1;
  115.        default:
  116.          return 0;
  117.     }
  118. }
  119.  
  120. ostream & operator << (ostream &o, Attack_Entry &entr)
  121. {
  122.     char text[50];
  123.     sprintf(text,"%04x",entr.info);
  124.     o << text;
  125.     return o;
  126. }